perm filename DVITYP.PAS[TEX,DEK] blob sn#716791 filedate 1983-06-26 generic text, type T, neo UTF8
{3:}{$D-,W+}PROGRAM DVITYPE(DVIFILE,OUTPUT);LABEL{4:}9999,30;{:4}
CONST{5:}MAXFONTS=100;MAXWIDTHS=10000;LINELENGTH=79;TERMINALLINE=150;
STACKSIZE=100;NAMESIZE=1000;NAMELENGTH=50;{:5}TYPE{8:}ASCIICODE=32..126;
{:8}{9:}TEXTFILE=PACKED FILE OF CHAR;{:9}{21:}EIGHTBITS=0..255;
BYTEFILE=PACKED FILE OF EIGHTBITS;{:21}VAR{10:}
XORD:ARRAY[CHAR]OF ASCIICODE;XCHR:ARRAY[0..255]OF CHAR;{:10}{22:}
DVIFILE:BYTEFILE;TFMFILE:BYTEFILE;{:22}{24:}CURLOC:INTEGER;
CURNAME:PACKED ARRAY[1..NAMELENGTH]OF CHAR;{:24}{25:}
B0,B1,B2,B3:EIGHTBITS;{:25}{30:}FONTNUM:ARRAY[0..MAXFONTS]OF INTEGER;
FONTNAME:ARRAY[0..MAXFONTS]OF 0..NAMESIZE;
NAMES:ARRAY[0..NAMESIZE]OF ASCIICODE;
FONTCHECKSUM:ARRAY[0..MAXFONTS]OF INTEGER;
FONTSCALEDSI:ARRAY[0..MAXFONTS]OF INTEGER;
FONTDESIGNSI:ARRAY[0..MAXFONTS]OF INTEGER;
FONTSPACE:ARRAY[0..MAXFONTS]OF INTEGER;
FONTBC:ARRAY[0..MAXFONTS]OF INTEGER;FONTEC:ARRAY[0..MAXFONTS]OF INTEGER;
WIDTHBASE:ARRAY[0..MAXFONTS]OF INTEGER;
WIDTH:ARRAY[0..MAXWIDTHS]OF INTEGER;NF:0..MAXFONTS;
WIDTHPTR:0..MAXWIDTHS;{:30}{33:}INWIDTH:ARRAY[0..255]OF INTEGER;
TFMCHECKSUM:INTEGER;{:33}{39:}PIXELWIDTH:ARRAY[0..MAXWIDTHS]OF INTEGER;
CONV:REAL;TRUECONV:REAL;NUMERATOR,DENOMINATOR:INTEGER;MAG:INTEGER;{:39}
{41:}OUTMODE:0..3;MAXPAGES:INTEGER;RESOLUTION:REAL;NEWMAG:INTEGER;{:41}
{42:}STARTCOUNT:ARRAY[0..9]OF INTEGER;STARTTHERE:ARRAY[0..9]OF BOOLEAN;
STARTVALS:0..9;COUNT:ARRAY[0..9]OF INTEGER;{:42}{45:}
BUFFER:ARRAY[0..TERMINALLINE]OF ASCIICODE;{:45}{48:}
BUFPTR:0..TERMINALLINE;{:48}{57:}INPOSTAMBLE:BOOLEAN;{:57}{64:}
DEFAULTDIREC:PACKED ARRAY[1..9]OF CHAR;{:64}{67:}TEXTPTR:0..LINELENGTH;
TEXTBUF:ARRAY[1..LINELENGTH]OF ASCIICODE;{:67}{72:}
H,V,W,X,Y,Z,HH,VV:INTEGER;
HSTACK,VSTACK,WSTACK,XSTACK,YSTACK,ZSTACK:ARRAY[0..STACKSIZE]OF INTEGER;
HHSTACK,VVSTACK:ARRAY[0..STACKSIZE]OF INTEGER;{:72}{73:}MAXV:INTEGER;
MAXH:INTEGER;MAXS:INTEGER;MAXVSOFAR,MAXHSOFAR,MAXSSOFAR:INTEGER;
TOTALPAGES:INTEGER;PAGECOUNT:INTEGER;{:73}{78:}S:INTEGER;SS:INTEGER;
CURFONT:INTEGER;SHOWING:BOOLEAN;{:78}{96:}OLDBACKPOINT:INTEGER;
NEWBACKPOINT:INTEGER;STARTED:BOOLEAN;{:96}{100:}POSTLOC:INTEGER;
FIRSTBACKPOI:INTEGER;STARTLOC:INTEGER;{:100}{107:}K,M,N,P,Q:INTEGER;
{:107}PROCEDURE INITIALIZE;VAR I:INTEGER;
BEGIN WRITELN('This is DVItype, Version 1.1');{11:}
FOR I:=0 TO 31 DO XCHR[I]:='?';XCHR[32]:=' ';XCHR[33]:='!';
XCHR[34]:='"';XCHR[35]:='#';XCHR[36]:='$';XCHR[37]:='%';XCHR[38]:='&';
XCHR[39]:='''';XCHR[40]:='(';XCHR[41]:=')';XCHR[42]:='*';XCHR[43]:='+';
XCHR[44]:=',';XCHR[45]:='-';XCHR[46]:='.';XCHR[47]:='/';XCHR[48]:='0';
XCHR[49]:='1';XCHR[50]:='2';XCHR[51]:='3';XCHR[52]:='4';XCHR[53]:='5';
XCHR[54]:='6';XCHR[55]:='7';XCHR[56]:='8';XCHR[57]:='9';XCHR[58]:=':';
XCHR[59]:=';';XCHR[60]:='<';XCHR[61]:='=';XCHR[62]:='>';XCHR[63]:='?';
XCHR[64]:='@';XCHR[65]:='A';XCHR[66]:='B';XCHR[67]:='C';XCHR[68]:='D';
XCHR[69]:='E';XCHR[70]:='F';XCHR[71]:='G';XCHR[72]:='H';XCHR[73]:='I';
XCHR[74]:='J';XCHR[75]:='K';XCHR[76]:='L';XCHR[77]:='M';XCHR[78]:='N';
XCHR[79]:='O';XCHR[80]:='P';XCHR[81]:='Q';XCHR[82]:='R';XCHR[83]:='S';
XCHR[84]:='T';XCHR[85]:='U';XCHR[86]:='V';XCHR[87]:='W';XCHR[88]:='X';
XCHR[89]:='Y';XCHR[90]:='Z';XCHR[91]:='[';XCHR[92]:='\';XCHR[93]:=']';
XCHR[94]:='↑';XCHR[95]:='_';XCHR[96]:='`';XCHR[97]:='a';XCHR[98]:='b';
XCHR[99]:='c';XCHR[100]:='d';XCHR[101]:='e';XCHR[102]:='f';
XCHR[103]:='g';XCHR[104]:='h';XCHR[105]:='i';XCHR[106]:='j';
XCHR[107]:='k';XCHR[108]:='l';XCHR[109]:='m';XCHR[110]:='n';
XCHR[111]:='o';XCHR[112]:='p';XCHR[113]:='q';XCHR[114]:='r';
XCHR[115]:='s';XCHR[116]:='t';XCHR[117]:='u';XCHR[118]:='v';
XCHR[119]:='w';XCHR[120]:='x';XCHR[121]:='y';XCHR[122]:='z';
XCHR[123]:='{';XCHR[124]:='|';XCHR[125]:='}';XCHR[126]:='~';
FOR I:=127 TO 255 DO XCHR[I]:='?';{:11}{12:}
FOR I:=0 TO 127 DO XORD[CHR(I)]:=32;
FOR I:=32 TO 126 DO XORD[XCHR[I]]:=I;{:12}{31:}NF:=0;WIDTHPTR:=0;
FONTNAME[0]:=0;FONTSPACE[0]:=0;{:31}{43:}OUTMODE:=3;MAXPAGES:=1000000;
STARTVALS:=0;STARTTHERE[0]:=FALSE;{:43}{58:}INPOSTAMBLE:=FALSE;{:58}
{65:}DEFAULTDIREC:='[TEX,SYS]';{:65}{68:}TEXTPTR:=0;{:68}{74:}
MAXV:=2147483647;MAXH:=2147483647;MAXS:=STACKSIZE+1;MAXVSOFAR:=0;
MAXHSOFAR:=0;MAXSSOFAR:=0;PAGECOUNT:=0;{:74}{97:}OLDBACKPOINT:=-1;
STARTED:=FALSE;{:97}END;{:3}{7:}PROCEDURE JUMPOUT;BEGIN GOTO 9999;END;
{:7}{23:}PROCEDURE OPENDVIFILE;BEGIN RESET(DVIFILE,'','/B:8');CURLOC:=0;
END;PROCEDURE OPENTFMFILE;BEGIN RESET(TFMFILE,CURNAME,'/B:8/O/N:19');
END;{:23}{26:}PROCEDURE READTFMWORD;BEGIN READ(TFMFILE,B0);
READ(TFMFILE,B1);READ(TFMFILE,B2);READ(TFMFILE,B3);END;{:26}{27:}
FUNCTION GETBYTE:INTEGER;VAR B:EIGHTBITS;
BEGIN IF EOF(DVIFILE)THEN GETBYTE:=0 ELSE BEGIN READ(DVIFILE,B);
CURLOC:=CURLOC+1;GETBYTE:=B;END;END;FUNCTION SIGNEDBYTE:INTEGER;
VAR B:EIGHTBITS;BEGIN READ(DVIFILE,B);CURLOC:=CURLOC+1;
IF B<128 THEN SIGNEDBYTE:=B ELSE SIGNEDBYTE:=B-256;END;
FUNCTION GETTWOBYTES:INTEGER;VAR A,B:EIGHTBITS;BEGIN READ(DVIFILE,A);
READ(DVIFILE,B);CURLOC:=CURLOC+2;GETTWOBYTES:=A*256+B;END;
FUNCTION SIGNEDPAIR:INTEGER;VAR A,B:EIGHTBITS;BEGIN READ(DVIFILE,A);
READ(DVIFILE,B);CURLOC:=CURLOC+2;
IF A<128 THEN SIGNEDPAIR:=A*256+B ELSE SIGNEDPAIR:=(A-256)*256+B;END;
FUNCTION GETTHREEBYTE:INTEGER;VAR A,B,C:EIGHTBITS;BEGIN READ(DVIFILE,A);
READ(DVIFILE,B);READ(DVIFILE,C);CURLOC:=CURLOC+3;
GETTHREEBYTE:=(A*256+B)*256+C;END;FUNCTION SIGNEDTRIO:INTEGER;
VAR A,B,C:EIGHTBITS;BEGIN READ(DVIFILE,A);READ(DVIFILE,B);
READ(DVIFILE,C);CURLOC:=CURLOC+3;
IF A<128 THEN SIGNEDTRIO:=(A*256+B)*256+C ELSE SIGNEDTRIO:=((A-256)*256+
B)*256+C;END;FUNCTION SIGNEDQUAD:INTEGER;VAR A,B,C,D:EIGHTBITS;
BEGIN READ(DVIFILE,A);READ(DVIFILE,B);READ(DVIFILE,C);READ(DVIFILE,D);
CURLOC:=CURLOC+4;
IF A<128 THEN SIGNEDQUAD:=((A*256+B)*256+C)*256+D ELSE SIGNEDQUAD:=(((A
-256)*256+B)*256+C)*256+D;END;{:27}{28:}FUNCTION DVILENGTH:INTEGER;
BEGIN SETPOS(DVIFILE,-1);DVILENGTH:=CURPOS(DVIFILE);END;
PROCEDURE MOVETOBYTE(N:INTEGER);BEGIN SETPOS(DVIFILE,N);CURLOC:=N;END;
{:28}{32:}PROCEDURE PRINTFONT(F:INTEGER);VAR K:0..NAMESIZE;
BEGIN IF F=NF THEN WRITE('UNDEFINED!')ELSE BEGIN FOR K:=FONTNAME[F]TO
FONTNAME[F+1]-1 DO WRITE(XCHR[NAMES[K]]);END;END;{:32}{34:}
FUNCTION INTFM(Z:INTEGER):BOOLEAN;LABEL 9997,9998,9999;VAR K:INTEGER;
LH:INTEGER;NW:INTEGER;WP:0..MAXWIDTHS;ALPHA,BETA:INTEGER;BEGIN{35:}
READTFMWORD;LH:=B2*256+B3;READTFMWORD;FONTBC[NF]:=B0*256+B1;
FONTEC[NF]:=B2*256+B3;
IF FONTEC[NF]<FONTBC[NF]THEN FONTBC[NF]:=FONTEC[NF]+1;
IF WIDTHPTR+FONTEC[NF]-FONTBC[NF]+1>MAXWIDTHS THEN BEGIN WRITELN(
'---not loaded, DVItype needs larger width table');GOTO 9998;END;
WP:=WIDTHPTR+FONTEC[NF]-FONTBC[NF]+1;READTFMWORD;NW:=B0*256+B1;
IF(NW=0)OR(NW>256)THEN GOTO 9997;
FOR K:=1 TO 3+LH DO BEGIN IF EOF(TFMFILE)THEN GOTO 9997;READTFMWORD;
IF K=4 THEN IF B0<128 THEN TFMCHECKSUM:=((B0*256+B1)*256+B2)*256+B3 ELSE
TFMCHECKSUM:=(((B0-256)*256+B1)*256+B2)*256+B3;END;{:35};{36:}
IF WP>0 THEN FOR K:=WIDTHPTR TO WP-1 DO BEGIN READTFMWORD;
IF B0>NW THEN GOTO 9997;WIDTH[K]:=B0;END;{:36};{37:}{38:}
BEGIN ALPHA:=16*Z;BETA:=16;WHILE Z>=8388608 DO BEGIN Z:=Z DIV 2;
BETA:=BETA DIV 2;END;END{:38};FOR K:=0 TO NW-1 DO BEGIN READTFMWORD;
INWIDTH[K]:=(((((B3*Z)DIV 256)+(B2*Z))DIV 256)+(B1*Z))DIV BETA;
IF B0>0 THEN IF B0<255 THEN GOTO 9997 ELSE INWIDTH[K]:=INWIDTH[K]-ALPHA;
END{:37};{40:}IF INWIDTH[0]<>0 THEN GOTO 9997;
WIDTHBASE[NF]:=WIDTHPTR-FONTBC[NF];
IF WP>0 THEN FOR K:=WIDTHPTR TO WP-1 DO IF WIDTH[K]=0 THEN BEGIN WIDTH[K
]:=2147483647;PIXELWIDTH[K]:=0;
END ELSE BEGIN WIDTH[K]:=INWIDTH[WIDTH[K]];
PIXELWIDTH[K]:=TRUNC(CONV*(WIDTH[K])+0.5);END{:40};WIDTHPTR:=WP;
INTFM:=TRUE;GOTO 9999;9997:WRITELN('---not loaded, TFM file is bad');
9998:INTFM:=FALSE;9999:END;{:34}{44:}FUNCTION STARTMATCH:BOOLEAN;
VAR K:0..9;MATCH:BOOLEAN;BEGIN MATCH:=TRUE;
FOR K:=0 TO STARTVALS DO IF STARTTHERE[K]AND(STARTCOUNT[K]<>COUNT[K])
THEN MATCH:=FALSE;STARTMATCH:=MATCH;END;{:44}{47:}PROCEDURE INPUTLN;
VAR K:0..TERMINALLINE;BEGIN BREAK(TTY);RESET(TTY);
IF EOLN(TTY)THEN READLN(TTY);K:=0;
WHILE(K<TERMINALLINE)AND NOT EOLN(TTY)DO BEGIN BUFFER[K]:=XORD[TTY↑];
K:=K+1;GET(TTY);END;BUFFER[K]:=32;END;{:47}{49:}
FUNCTION GETINTEGER:INTEGER;VAR X:INTEGER;NEGATIVE:BOOLEAN;
BEGIN IF BUFFER[BUFPTR]=45 THEN BEGIN NEGATIVE:=TRUE;BUFPTR:=BUFPTR+1;
END ELSE NEGATIVE:=FALSE;X:=0;
WHILE(BUFFER[BUFPTR]>=48)AND(BUFFER[BUFPTR]<=57)DO BEGIN X:=10*X+BUFFER[
BUFPTR]-48;BUFPTR:=BUFPTR+1;END;
IF NEGATIVE THEN GETINTEGER:=-X ELSE GETINTEGER:=X;END;{:49}{50:}
PROCEDURE DIALOG;LABEL 1,2,3,4,5;VAR K:INTEGER;BEGIN REWRITE(TTY);
WRITELN(TTY,'This is DVItype, Version 1.1');{51:}
1:WRITE(TTY,'Output level (default=3, ? for help): ');OUTMODE:=3;
INPUTLN;
IF BUFFER[0]<>32 THEN IF(BUFFER[0]>=48)AND(BUFFER[0]<=51)THEN OUTMODE:=
BUFFER[0]-48 ELSE BEGIN WRITE(TTY,'Type 3 for complete listing,');
WRITE(TTY,' 0 for errors only,');
WRITELN(TTY,' 1 or 2 for something in between.');GOTO 1;END{:51};{52:}
2:WRITE(TTY,'Starting page (default=*): ');STARTVALS:=0;
STARTTHERE[0]:=FALSE;INPUTLN;BUFPTR:=0;K:=0;
IF BUFFER[0]<>32 THEN REPEAT IF BUFFER[BUFPTR]=42 THEN BEGIN STARTTHERE[
K]:=FALSE;BUFPTR:=BUFPTR+1;END ELSE BEGIN STARTTHERE[K]:=TRUE;
STARTCOUNT[K]:=GETINTEGER;END;
IF(K<9)AND(BUFFER[BUFPTR]=46)THEN BEGIN K:=K+1;BUFPTR:=BUFPTR+1;
END ELSE IF BUFFER[BUFPTR]=32 THEN STARTVALS:=K ELSE BEGIN WRITE(TTY,
'Type, e.g., 1.*.-5 to specify the ');
WRITELN(TTY,'first page with \count0=1, \count2=-5.');GOTO 2;END;
UNTIL STARTVALS=K{:52};{53:}
3:WRITE(TTY,'Maximum number of pages (default=1000000): ');
MAXPAGES:=1000000;INPUTLN;BUFPTR:=0;
IF BUFFER[0]<>32 THEN BEGIN MAXPAGES:=GETINTEGER;
IF MAXPAGES<=0 THEN BEGIN WRITELN(TTY,'Please type a positive number.');
GOTO 3;END;END{:53};{54:}4:WRITE(TTY,'Assumed device resolution');
WRITE(TTY,' in pixels per inch (default=240/1): ');RESOLUTION:=240.0;
INPUTLN;BUFPTR:=0;IF BUFFER[0]<>32 THEN BEGIN K:=GETINTEGER;
IF(K>0)AND(BUFFER[BUFPTR]=47)AND(BUFFER[BUFPTR+1]>48)AND(BUFFER[BUFPTR+1
]<=57)THEN BEGIN BUFPTR:=BUFPTR+1;RESOLUTION:=K/GETINTEGER;
END ELSE BEGIN WRITE(TTY,'Type a ratio of positive integers;');
WRITELN(TTY,' (1 pixel per mm would be 254/10).');GOTO 4;END;END{:54};
{55:}5:WRITE(TTY,'New magnification (default=0 to keep the old one): ');
NEWMAG:=0;INPUTLN;BUFPTR:=0;
IF BUFFER[0]<>32 THEN IF(BUFFER[0]>=48)AND(BUFFER[0]<=57)THEN NEWMAG:=
GETINTEGER ELSE BEGIN WRITE(TTY,'Type a positive integer to override ');
WRITELN(TTY,'the magnification in the DVI file.');GOTO 5;END{:55};{56:}
WRITELN('Options selected:');WRITE('  Starting page = ');
FOR K:=0 TO STARTVALS DO BEGIN IF STARTTHERE[K]THEN WRITE(STARTCOUNT[K]:
1)ELSE WRITE('*');IF K<STARTVALS THEN WRITE('.')ELSE WRITELN(' ');END;
WRITELN('  Maximum number of pages = ',MAXPAGES:1);
WRITE('  Output level = ',OUTMODE:1);CASE OUTMODE OF 0:WRITELN(
' (showing bops, fonts, and error messages only)');
1:WRITELN(' (terse)');2:WRITELN(' (verbose)');
3:IF TRUE THEN WRITELN(' (the works)')ELSE BEGIN OUTMODE:=2;
WRITELN(' (the works: same as level 2 in this DVItype)');END;END;
WRITELN('  Resolution = ',RESOLUTION:12:8,' pixels per inch');
IF NEWMAG>0 THEN WRITELN('  New magnification factor = ',NEWMAG/1000:8:3
){:56};END;{:50}{59:}PROCEDURE DEFINEFONT(E:INTEGER);VAR F:0..MAXFONTS;
P:INTEGER;N:INTEGER;C,Q,D:INTEGER;R:0..NAMELENGTH;J,K:0..NAMESIZE;
MISMATCH:BOOLEAN;BEGIN IF NF=MAXFONTS THEN BEGIN WRITE(' ',
'DVItype capacity exceeded (max fonts=',MAXFONTS:1,')!');JUMPOUT;END;
FONTNUM[NF]:=E;F:=0;WHILE FONTNUM[F]<>E DO F:=F+1;{61:}C:=SIGNEDQUAD;
FONTCHECKSUM[NF]:=C;Q:=SIGNEDQUAD;FONTSCALEDSI[NF]:=Q;D:=SIGNEDQUAD;
FONTDESIGNSI[NF]:=D;P:=GETBYTE;N:=GETBYTE;
IF FONTNAME[NF]+N+P>NAMESIZE THEN BEGIN WRITE(' ',
'DVItype capacity exceeded (name size=',NAMESIZE:1,')!');JUMPOUT;END;
FONTNAME[NF+1]:=FONTNAME[NF]+N+P;
IF SHOWING THEN WRITE(': ')ELSE WRITE('Font ',E:1,': ');
IF N+P=0 THEN WRITE('null font name!')ELSE FOR K:=FONTNAME[NF]TO
FONTNAME[NF+1]-1 DO NAMES[K]:=GETBYTE;NF:=NF+1;PRINTFONT(NF-1);
NF:=NF-1{:61};
IF((OUTMODE=3)AND INPOSTAMBLE)OR((OUTMODE<3)AND NOT INPOSTAMBLE)THEN
BEGIN IF F<NF THEN WRITELN('---this font was already defined!');
END ELSE BEGIN IF F=NF THEN WRITELN(
'---this font wasn''t loaded before!');END;IF F=NF THEN{62:}BEGIN{66:}
FOR K:=1 TO NAMELENGTH DO CURNAME[K]:=' ';R:=0;
FOR K:=FONTNAME[NF]+P TO FONTNAME[NF+1]-1 DO IF(K<=FONTNAME[F]+P+2)OR(K
>=FONTNAME[NF+1]-3)THEN BEGIN R:=R+1;
IF R+4>NAMELENGTH THEN BEGIN WRITE(' ',
'DVItype capacity exceeded (max font name length=',NAMELENGTH:1,')!');
JUMPOUT;END;
IF(NAMES[K]>=97)AND(NAMES[K]<=122)THEN CURNAME[R]:=XCHR[NAMES[K]-32]ELSE
CURNAME[R]:=XCHR[NAMES[K]];END;CURNAME[R+1]:='.';CURNAME[R+2]:='T';
CURNAME[R+3]:='F';CURNAME[R+4]:='M';R:=R+4;
IF P=0 THEN FOR K:=1 TO 9 DO BEGIN R:=R+1;
IF R>NAMELENGTH THEN BEGIN WRITE(' ','Font name is too long!');JUMPOUT;
END;CURNAME[R]:=DEFAULTDIREC[K];
END ELSE FOR K:=FONTNAME[NF]TO FONTNAME[NF]+P-1 DO BEGIN R:=R+1;
IF R>NAMELENGTH THEN BEGIN WRITE(' ','Font name is too long!');JUMPOUT;
END;
IF(NAMES[K]>=97)AND(NAMES[K]<=122)THEN CURNAME[R]:=XCHR[NAMES[K]-32]ELSE
CURNAME[R]:=XCHR[NAMES[K]];END{:66};OPENTFMFILE;
IF EOF(TFMFILE)THEN WRITE('---not loaded, TFM file can''t be opened!')
ELSE BEGIN IF(Q<=0)OR(Q>=134217728)THEN WRITE(
'---not loaded, bad scale (',Q:1,')!')ELSE IF(D<=0)OR(D>=134217728)THEN
WRITE('---not loaded, bad design size (',D:1,')!')ELSE IF INTFM(Q)THEN{
63:}BEGIN FONTSPACE[NF]:=Q DIV 6;
IF(C<>0)AND(TFMCHECKSUM<>0)AND(C<>TFMCHECKSUM)THEN BEGIN WRITELN(
'---beware: check sums do not agree!');
WRITELN('   (',C:1,' vs. ',TFMCHECKSUM:1,')');WRITE('   ');END;
WRITE('---loaded at size ',Q:1,' DVI units');
D:=TRUNC((100.0*CONV*Q)/(TRUECONV*D)+0.5);
IF D<>100 THEN BEGIN WRITELN(' ');
WRITE(' (this font is magnified ',D:1,'%)');END;NF:=NF+1;
FONTSPACE[NF]:=0;END{:63};END;IF OUTMODE=0 THEN WRITELN(' ');END{:62}
ELSE{60:}BEGIN IF FONTCHECKSUM[F]<>C THEN WRITELN(
'---check sum doesn''t match previous definition!');
IF FONTSCALEDSI[F]<>Q THEN WRITELN(
'---scaled size doesn''t match previous definition!');
IF FONTDESIGNSI[F]<>D THEN WRITELN(
'---design size doesn''t match previous definition!');J:=FONTNAME[F];
K:=FONTNAME[NF];MISMATCH:=FALSE;
WHILE J<FONTNAME[F+1]DO BEGIN IF NAMES[J]<>NAMES[K]THEN MISMATCH:=TRUE;
J:=J+1;K:=K+1;END;IF K<>FONTNAME[NF+1]THEN MISMATCH:=TRUE;
IF MISMATCH THEN WRITELN(
'---font name doesn''t match previous definition!');END{:60};END;{:59}
{69:}PROCEDURE FLUSHTEXT;VAR K:0..LINELENGTH;
BEGIN IF TEXTPTR>0 THEN BEGIN IF OUTMODE>0 THEN BEGIN WRITE('[');
FOR K:=1 TO TEXTPTR DO WRITE(XCHR[TEXTBUF[K]]);WRITELN(']');END;
TEXTPTR:=0;END;END;{:69}{70:}PROCEDURE OUTTEXT(C:ASCIICODE);
BEGIN IF TEXTPTR=LINELENGTH-2 THEN FLUSHTEXT;TEXTPTR:=TEXTPTR+1;
TEXTBUF[TEXTPTR]:=C;END;{:70}{75:}
FUNCTION FIRSTPAR(O:EIGHTBITS):INTEGER;
BEGIN CASE O OF 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,
22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,
46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,
70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,
94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,
113,114,115,116,117,118,119,120,121,122,123,124,125,126,127:FIRSTPAR:=O
-0;128,133,235,239,243:FIRSTPAR:=GETBYTE;
129,134,236,240,244:FIRSTPAR:=GETTWOBYTES;
130,135,237,241,245:FIRSTPAR:=GETTHREEBYTE;
143,148,153,157,162,167:FIRSTPAR:=SIGNEDBYTE;
144,149,154,158,163,168:FIRSTPAR:=SIGNEDPAIR;
145,150,155,159,164,169:FIRSTPAR:=SIGNEDTRIO;
131,132,136,137,146,151,156,160,165,170,238,242,246:FIRSTPAR:=SIGNEDQUAD
;138,139,140,141,142,247,248,249,250,251,252,253,254,255:FIRSTPAR:=0;
147:FIRSTPAR:=W;152:FIRSTPAR:=X;161:FIRSTPAR:=Y;166:FIRSTPAR:=Z;
171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,
189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,
207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,
225,226,227,228,229,230,231,232,233,234:FIRSTPAR:=O-171;END;END;{:75}
{76:}FUNCTION RULEPIXELS(X:INTEGER):INTEGER;VAR N:INTEGER;
BEGIN N:=TRUNC(CONV*X);
IF N<CONV*X THEN RULEPIXELS:=N+1 ELSE RULEPIXELS:=N;END;{:76}{79:}{82:}
FUNCTION SPECIALCASES(O:EIGHTBITS;P,A:INTEGER):BOOLEAN;
LABEL 46,44,30,9998;VAR Q:INTEGER;K:INTEGER;BADCHAR:BOOLEAN;
PURE:BOOLEAN;BEGIN PURE:=TRUE;
CASE O OF 133,134,135,136:BEGIN IF OUTMODE>0 THEN BEGIN FLUSHTEXT;
SHOWING:=TRUE;WRITE(A:1,': ','put',O-132:1,' ',P:1);END;GOTO 30;END;
{85:}
157,158,159,160:BEGIN IF ABS(P)>=5*FONTSPACE[CURFONT]THEN VV:=TRUNC(CONV
*(V+P)+0.5)ELSE VV:=VV+TRUNC(CONV*(P)+0.5);
IF OUTMODE>0 THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','down',O-156:1,' ',P:1);END;GOTO 44;END;
161,162,163,164,165:BEGIN Y:=P;
IF ABS(P)>=5*FONTSPACE[CURFONT]THEN VV:=TRUNC(CONV*(V+P)+0.5)ELSE VV:=VV
+TRUNC(CONV*(P)+0.5);IF OUTMODE>0 THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','y',O-161:1,' ',P:1);END;GOTO 44;END;
166,167,168,169,170:BEGIN Z:=P;
IF ABS(P)>=5*FONTSPACE[CURFONT]THEN VV:=TRUNC(CONV*(V+P)+0.5)ELSE VV:=VV
+TRUNC(CONV*(P)+0.5);IF OUTMODE>0 THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','z',O-166:1,' ',P:1);END;GOTO 44;END;{:85}{86:}
171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,
189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,
207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,
225,226,227,228,229,230,231,232,233,234:BEGIN IF OUTMODE>0 THEN BEGIN
FLUSHTEXT;SHOWING:=TRUE;WRITE(A:1,': ','fntnum',P:1);END;GOTO 46;END;
235,236,237,238:BEGIN IF OUTMODE>0 THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','fnt',O-234:1,' ',P:1);END;GOTO 46;END;
243,244,245,246:BEGIN IF OUTMODE>0 THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','fntdef',O-242:1,' ',P:1);END;DEFINEFONT(P);GOTO 30;END;
{:86}239,240,241,242:{87:}BEGIN IF OUTMODE>0 THEN BEGIN FLUSHTEXT;
SHOWING:=TRUE;WRITE(A:1,': ','xxx''');END;BADCHAR:=FALSE;
FOR K:=1 TO P DO BEGIN Q:=GETBYTE;
IF(Q>=32)AND(Q<=126)THEN BEGIN IF SHOWING THEN WRITE(XCHR[Q]);
END ELSE BADCHAR:=TRUE;END;IF SHOWING THEN WRITE('''');
IF BADCHAR THEN IF NOT SHOWING THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','non-ascii character in xxx command!');
END ELSE WRITE(' ','non-ascii character in xxx command!');GOTO 30;
END{:87};247:BEGIN IF NOT SHOWING THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','preamble command within a page!');
END ELSE WRITE(' ','preamble command within a page!');GOTO 9998;END;
248,249:BEGIN IF NOT SHOWING THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','postamble command within a page!');
END ELSE WRITE(' ','postamble command within a page!');GOTO 9998;END;
OTHERS:BEGIN IF NOT SHOWING THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','undefined command ',O:1,'!');
END ELSE WRITE(' ','undefined command ',O:1,'!');GOTO 30;END END;
44:{92:}
IF(V>0)AND(P>0)THEN IF V>2147483647-P THEN BEGIN IF NOT SHOWING THEN
BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','arithmetic overflow! parameter changed from ',P:1,' to '
,2147483647-V:1);
END ELSE WRITE(' ','arithmetic overflow! parameter changed from ',P:1,
' to ',2147483647-V:1);P:=2147483647-V;END;
IF(V<0)AND(P<0)THEN IF-V>P+2147483647 THEN BEGIN IF NOT SHOWING THEN
BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','arithmetic overflow! parameter changed from ',P:1,' to '
,(-V)-2147483647:1);
END ELSE WRITE(' ','arithmetic overflow! parameter changed from ',P:1,
' to ',(-V)-2147483647:1);P:=(-V)-2147483647;END;
IF SHOWING THEN BEGIN WRITE(' v:=',V:1);IF P>=0 THEN WRITE('+');
WRITE(P:1,'=',V+P:1,', vv:=',VV:1);END;V:=V+P;
IF ABS(V)>MAXVSOFAR THEN BEGIN MAXVSOFAR:=ABS(V);
IF ABS(V)>MAXV THEN IF NOT SHOWING THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','warning: |v|>',MAXVSOFAR:1,'!');
END ELSE WRITE(' ','warning: |v|>',MAXVSOFAR:1,'!');END;GOTO 30{:92};
46:{94:}FONTNUM[NF]:=P;CURFONT:=0;
WHILE FONTNUM[CURFONT]<>P DO CURFONT:=CURFONT+1;
IF SHOWING THEN BEGIN WRITE(' current font is ');PRINTFONT(CURFONT);END;
GOTO 30{:94};9998:PURE:=FALSE;30:SPECIALCASES:=PURE;END;{:82}
FUNCTION DOPAGE:BOOLEAN;LABEL 41,42,43,45,30,9998,9999;VAR O:EIGHTBITS;
P,Q:INTEGER;A:INTEGER;BEGIN CURFONT:=NF;S:=0;H:=0;V:=0;W:=0;X:=0;Y:=0;
Z:=0;HH:=0;VV:=0;WHILE TRUE DO{80:}BEGIN A:=CURLOC;SHOWING:=FALSE;
O:=GETBYTE;P:=FIRSTPAR(O);
IF EOF(DVIFILE)THEN BEGIN WRITE(' ','Bad DVI file: ',
'the file ended prematurely','!');JUMPOUT;END;{81:}IF O<128 THEN{88:}
BEGIN IF(O>32)AND(O<=126)THEN BEGIN OUTTEXT(P);
IF OUTMODE>=2 THEN BEGIN SHOWING:=TRUE;WRITE(A:1,': ','setchar',P:1);
END;END ELSE IF OUTMODE>0 THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','setchar',P:1);END;GOTO 41;END{:88}
ELSE CASE O OF 128,129,130,131:BEGIN IF OUTMODE>0 THEN BEGIN FLUSHTEXT;
SHOWING:=TRUE;WRITE(A:1,': ','set',O-127:1,' ',P:1);END;GOTO 41;END;
132:BEGIN IF OUTMODE>0 THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','setrule');END;GOTO 42;END;
137:BEGIN IF OUTMODE>0 THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','putrule');END;GOTO 42;END;{83:}
138:BEGIN IF OUTMODE>=2 THEN BEGIN SHOWING:=TRUE;WRITE(A:1,': ','nop');
END;GOTO 30;END;139:BEGIN IF NOT SHOWING THEN BEGIN FLUSHTEXT;
SHOWING:=TRUE;WRITE(A:1,': ','bop occurred before eop');
END ELSE WRITE(' ','bop occurred before eop');GOTO 9998;END;
140:BEGIN IF OUTMODE>0 THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','eop');END;
IF S<>0 THEN IF NOT SHOWING THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','stack not empty at end of page (level ',S:1,')!');
END ELSE WRITE(' ','stack not empty at end of page (level ',S:1,')!');
DOPAGE:=TRUE;WRITELN(' ');GOTO 9999;END;
141:BEGIN IF OUTMODE>0 THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','push');END;IF S=MAXSSOFAR THEN BEGIN MAXSSOFAR:=S+1;
IF S=MAXS THEN IF NOT SHOWING THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','deeper than claimed in postamble!');
END ELSE WRITE(' ','deeper than claimed in postamble!');
IF S=STACKSIZE THEN BEGIN IF NOT SHOWING THEN BEGIN FLUSHTEXT;
SHOWING:=TRUE;
WRITE(A:1,': ','DVItype capacity exceeded (stack size=',STACKSIZE:1,')')
;
END ELSE WRITE(' ','DVItype capacity exceeded (stack size=',STACKSIZE:1,
')');GOTO 9998;END;END;HSTACK[S]:=H;VSTACK[S]:=V;WSTACK[S]:=W;
XSTACK[S]:=X;YSTACK[S]:=Y;ZSTACK[S]:=Z;HHSTACK[S]:=HH;VVSTACK[S]:=VV;
S:=S+1;SS:=S-1;GOTO 45;END;142:BEGIN IF OUTMODE>0 THEN BEGIN FLUSHTEXT;
SHOWING:=TRUE;WRITE(A:1,': ','pop');END;
IF S=0 THEN IF NOT SHOWING THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','(illegal at level zero)!');
END ELSE WRITE(' ','(illegal at level zero)!')ELSE BEGIN S:=S-1;
HH:=HHSTACK[S];VV:=VVSTACK[S];H:=HSTACK[S];V:=VSTACK[S];W:=WSTACK[S];
X:=XSTACK[S];Y:=YSTACK[S];Z:=ZSTACK[S];END;SS:=S;GOTO 45;END;{:83}{84:}
143,144,145,146:BEGIN IF ABS(P)>=FONTSPACE[CURFONT]THEN BEGIN OUTTEXT(32
);HH:=TRUNC(CONV*(H+P)+0.5);END ELSE HH:=HH+TRUNC(CONV*(P)+0.5);
IF OUTMODE>=2 THEN BEGIN SHOWING:=TRUE;
WRITE(A:1,': ','right',O-142:1,' ',P:1);END;Q:=P;GOTO 43;END;
147,148,149,150,151:BEGIN W:=P;
IF ABS(P)>=FONTSPACE[CURFONT]THEN BEGIN OUTTEXT(32);
HH:=TRUNC(CONV*(H+P)+0.5);END ELSE HH:=HH+TRUNC(CONV*(P)+0.5);
IF OUTMODE>=2 THEN BEGIN SHOWING:=TRUE;
WRITE(A:1,': ','w',O-147:1,' ',P:1);END;Q:=P;GOTO 43;END;
152,153,154,155,156:BEGIN X:=P;
IF ABS(P)>=FONTSPACE[CURFONT]THEN BEGIN OUTTEXT(32);
HH:=TRUNC(CONV*(H+P)+0.5);END ELSE HH:=HH+TRUNC(CONV*(P)+0.5);
IF OUTMODE>=2 THEN BEGIN SHOWING:=TRUE;
WRITE(A:1,': ','x',O-152:1,' ',P:1);END;Q:=P;GOTO 43;END;{:84}
OTHERS:IF SPECIALCASES(O,P,A)THEN GOTO 30 ELSE GOTO 9998 END{:81};
41:{89:}IF FONTEC[CURFONT]=256 THEN P:=256;
IF(P<FONTBC[CURFONT])OR(P>FONTEC[CURFONT])THEN Q:=2147483647 ELSE Q:=
WIDTH[WIDTHBASE[CURFONT]+P];
IF Q=2147483647 THEN BEGIN IF NOT SHOWING THEN BEGIN FLUSHTEXT;
SHOWING:=TRUE;WRITE(A:1,': ','character ',P:1,' invalid in font ');
END ELSE WRITE(' ','character ',P:1,' invalid in font ');
PRINTFONT(CURFONT);IF CURFONT<>NF THEN WRITE('!');END;
IF O>=133 THEN GOTO 30;
IF Q=2147483647 THEN Q:=0 ELSE HH:=HH+PIXELWIDTH[WIDTHBASE[CURFONT]+P];
GOTO 43{:89};42:{90:}Q:=SIGNEDQUAD;
IF SHOWING THEN BEGIN WRITE(' height ',P:1,', width ',Q:1);
IF(P<=0)OR(Q<=0)THEN WRITE(' (invisible)')ELSE WRITE(' (',RULEPIXELS(P):
1,'x',RULEPIXELS(Q):1,' pixels)');END;IF O=137 THEN GOTO 30;
IF SHOWING THEN WRITELN(' ');HH:=HH+RULEPIXELS(Q);GOTO 43{:90};43:{91:}
IF(H>0)AND(Q>0)THEN IF H>2147483647-Q THEN BEGIN IF NOT SHOWING THEN
BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','arithmetic overflow! parameter changed from ',Q:1,' to '
,2147483647-H:1);
END ELSE WRITE(' ','arithmetic overflow! parameter changed from ',Q:1,
' to ',2147483647-H:1);Q:=2147483647-H;END;
IF(H<0)AND(Q<0)THEN IF-H>Q+2147483647 THEN BEGIN IF NOT SHOWING THEN
BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','arithmetic overflow! parameter changed from ',Q:1,' to '
,(-H)-2147483647:1);
END ELSE WRITE(' ','arithmetic overflow! parameter changed from ',Q:1,
' to ',(-H)-2147483647:1);Q:=(-H)-2147483647;END;
IF SHOWING THEN BEGIN WRITE(' h:=',H:1);IF Q>=0 THEN WRITE('+');
WRITE(Q:1,'=',H+Q:1,', hh:=',HH:1);END;H:=H+Q;
IF ABS(H)>MAXHSOFAR THEN BEGIN MAXHSOFAR:=ABS(H);
IF ABS(H)>MAXH THEN IF NOT SHOWING THEN BEGIN FLUSHTEXT;SHOWING:=TRUE;
WRITE(A:1,': ','warning: |h|>',MAXHSOFAR:1,'!');
END ELSE WRITE(' ','warning: |h|>',MAXHSOFAR:1,'!');END;GOTO 30{:91};
45:{93:}IF SHOWING THEN BEGIN WRITELN(' ');
WRITE('level ',SS:1,':(h=',H:1,',v=',V:1,',w=',W:1,',x=',X:1,',y=',Y:1,
',z=',Z:1,',hh=',HH:1,',vv=',VV:1,')');END;GOTO 30{:93};
30:IF SHOWING THEN WRITELN(' ');END{:80};9998:WRITELN('!');
DOPAGE:=FALSE;9999:END;{:79}{95:}PROCEDURE SKIPPAGES;LABEL 9999;
VAR P:INTEGER;K:0..255;DOWNTHEDRAIN:INTEGER;BEGIN SHOWING:=FALSE;
WHILE TRUE DO BEGIN IF EOF(DVIFILE)THEN BEGIN WRITE(' ','Bad DVI file: '
,'the file ended prematurely','!');JUMPOUT;END;K:=GETBYTE;
P:=FIRSTPAR(K);CASE K OF 139:BEGIN{98:}NEWBACKPOINT:=CURLOC-1;
PAGECOUNT:=PAGECOUNT+1;FOR K:=0 TO 9 DO COUNT[K]:=SIGNEDQUAD;
IF SIGNEDQUAD<>OLDBACKPOINT THEN WRITELN('backpointer in byte ',CURLOC-4
:1,' should be ',OLDBACKPOINT:1,'!');OLDBACKPOINT:=NEWBACKPOINT{:98};
IF NOT STARTED AND STARTMATCH THEN BEGIN STARTED:=TRUE;GOTO 9999;END;
END;132,137:DOWNTHEDRAIN:=SIGNEDQUAD;
243,244,245,246:BEGIN DEFINEFONT(P);WRITELN(' ');END;
239,240,241,242:WHILE P>0 DO BEGIN DOWNTHEDRAIN:=GETBYTE;P:=P-1;END;
248:BEGIN INPOSTAMBLE:=TRUE;GOTO 9999;END;OTHERS:END;END;9999:END;{:95}
{102:}PROCEDURE READPOSTAMBL;VAR K:INTEGER;P,Q,M:INTEGER;
BEGIN SHOWING:=FALSE;POSTLOC:=CURLOC-5;
WRITELN('Postamble starts at byte ',POSTLOC:1,'.');
IF SIGNEDQUAD<>NUMERATOR THEN WRITELN(
'numerator doesn''t match the preamble!');
IF SIGNEDQUAD<>DENOMINATOR THEN WRITELN(
'denominator doesn''t match the preamble!');
IF SIGNEDQUAD<>MAG THEN IF NEWMAG=0 THEN WRITELN(
'magnification doesn''t match the preamble!');MAXV:=SIGNEDQUAD;
MAXH:=SIGNEDQUAD;WRITE('maxv=',MAXV:1,', maxh=',MAXH:1);
MAXS:=GETTWOBYTES;TOTALPAGES:=GETTWOBYTES;
WRITELN(', maxstackdepth=',MAXS:1,', totalpages=',TOTALPAGES:1);
IF OUTMODE<3 THEN{103:}
BEGIN IF MAXV<MAXVSOFAR THEN WRITELN('warning: observed maxv was ',
MAXVSOFAR:1);
IF MAXH<MAXHSOFAR THEN WRITELN('warning: observed maxh was ',MAXHSOFAR:1
);IF MAXS<MAXSSOFAR THEN WRITELN('warning: observed maxstackdepth was ',
MAXSSOFAR:1);
IF PAGECOUNT<>TOTALPAGES THEN WRITELN('there are really ',PAGECOUNT:1,
' pages, not ',TOTALPAGES:1,'!');END{:103};{105:}REPEAT K:=GETBYTE;
IF(K>=243)AND(K<247)THEN BEGIN P:=FIRSTPAR(K);DEFINEFONT(P);
WRITELN(' ');K:=138;END;UNTIL K<>138;
IF K<>249 THEN WRITELN('byte ',CURLOC-1:1,' is not postpost!'){:105};
{104:}Q:=SIGNEDQUAD;
IF Q<>POSTLOC THEN WRITELN('bad postamble pointer in byte ',CURLOC-4:1,
'!');M:=GETBYTE;
IF M<>2 THEN WRITELN('identification in byte ',CURLOC-1:1,' should be ',
2:1,'!');K:=CURLOC;M:=223;WHILE(M=223)AND NOT EOF(DVIFILE)DO M:=GETBYTE;
IF NOT EOF(DVIFILE)THEN BEGIN WRITE(' ','Bad DVI file: ',
'signature in byte ',CURLOC-1:1,' should be 223','!');JUMPOUT;
END ELSE IF CURLOC<K+4 THEN WRITELN(
'not enough signature bytes at end of file (',CURLOC-K:1,')');{:104};
END;{:102}{106:}BEGIN INITIALIZE;DIALOG;{108:}OPENDVIFILE;P:=GETBYTE;
IF P<>247 THEN BEGIN WRITE(' ','Bad DVI file: ',
'First byte isn''t start of preamble!','!');JUMPOUT;END;P:=GETBYTE;
IF P<>2 THEN WRITELN('identification in byte 1 should be ',2:1,'!');
{109:}NUMERATOR:=SIGNEDQUAD;DENOMINATOR:=SIGNEDQUAD;
IF NUMERATOR<=0 THEN BEGIN WRITE(' ','Bad DVI file: ','numerator is ',
NUMERATOR:1,'!');JUMPOUT;END;
IF DENOMINATOR<=0 THEN BEGIN WRITE(' ','Bad DVI file: ',
'denominator is ',DENOMINATOR:1,'!');JUMPOUT;END;
WRITELN('numerator/denominator=',NUMERATOR:1,'/',DENOMINATOR:1);
CONV:=(NUMERATOR/254000.0)*(RESOLUTION/DENOMINATOR);MAG:=SIGNEDQUAD;
IF NEWMAG>0 THEN MAG:=NEWMAG ELSE IF MAG<=0 THEN BEGIN WRITE(' ',
'Bad DVI file: ','magnification is ',MAG:1,'!');JUMPOUT;END;
TRUECONV:=CONV;CONV:=TRUECONV*(MAG/1000.0);
WRITELN('magnification=',MAG:1,'; ',CONV:16:8,' pixels per DVI unit'){:
109};P:=GETBYTE;WRITE('''');WHILE P>0 DO BEGIN P:=P-1;
WRITE(XCHR[GETBYTE]);END;WRITELN(''''){:108};
IF OUTMODE=3 THEN BEGIN{99:}N:=DVILENGTH;
IF N<57 THEN BEGIN WRITE(' ','Bad DVI file: ','only ',N:1,' bytes long',
'!');JUMPOUT;END;M:=N-4;
REPEAT IF M=0 THEN BEGIN WRITE(' ','Bad DVI file: ','all 223s','!');
JUMPOUT;END;MOVETOBYTE(M);K:=GETBYTE;M:=M-1;UNTIL K<>223;
IF K<>2 THEN BEGIN WRITE(' ','Bad DVI file: ','ID byte is ',K:1,'!');
JUMPOUT;END;MOVETOBYTE(M-3);Q:=SIGNEDQUAD;
IF(Q<0)OR(Q>M-36)THEN BEGIN WRITE(' ','Bad DVI file: ','post pointer ',Q
:1,' at byte ',M-3:1,'!');JUMPOUT;END;MOVETOBYTE(Q);K:=GETBYTE;
IF K<>248 THEN BEGIN WRITE(' ','Bad DVI file: ','byte ',Q:1,
' is not post','!');JUMPOUT;END;POSTLOC:=Q;FIRSTBACKPOI:=SIGNEDQUAD{:99}
;INPOSTAMBLE:=TRUE;READPOSTAMBL;INPOSTAMBLE:=FALSE;{101:}Q:=POSTLOC;
P:=FIRSTBACKPOI;STARTLOC:=-1;
IF P>=0 THEN REPEAT IF P>Q-46 THEN BEGIN WRITE(' ','Bad DVI file: ',
'page link ',P:1,' after byte ',Q:1,'!');JUMPOUT;END;Q:=P;MOVETOBYTE(Q);
K:=GETBYTE;IF K=139 THEN PAGECOUNT:=PAGECOUNT+1 ELSE BEGIN WRITE(' ',
'Bad DVI file: ','byte ',Q:1,' is not bop','!');JUMPOUT;END;
FOR K:=0 TO 9 DO COUNT[K]:=SIGNEDQUAD;IF STARTMATCH THEN STARTLOC:=Q;
P:=SIGNEDQUAD;UNTIL P<0;
IF PAGECOUNT<>TOTALPAGES THEN WRITELN('there are really ',PAGECOUNT:1,
' pages, not ',TOTALPAGES:1,'!');IF STARTLOC<0 THEN BEGIN WRITE(' ',
'starting page number could not be found!');JUMPOUT;END;
MOVETOBYTE(STARTLOC+1);OLDBACKPOINT:=STARTLOC;
FOR K:=0 TO 9 DO COUNT[K]:=SIGNEDQUAD;P:=SIGNEDQUAD;STARTED:=TRUE{:101};
END ELSE SKIPPAGES;IF NOT INPOSTAMBLE THEN{110:}
BEGIN WHILE MAXPAGES>0 DO BEGIN MAXPAGES:=MAXPAGES-1;WRITELN(' ');
WRITE(CURLOC-45:1,': beginning of page ');
FOR K:=0 TO STARTVALS DO BEGIN WRITE(COUNT[K]:1);
IF K<STARTVALS THEN WRITE('.')ELSE WRITELN(' ');END;
IF NOT DOPAGE THEN BEGIN WRITE(' ','Bad DVI file: ',
'page ended unexpectedly','!');JUMPOUT;END;REPEAT K:=GETBYTE;
IF(K>=243)AND(K<247)THEN BEGIN P:=FIRSTPAR(K);DEFINEFONT(P);K:=138;END;
UNTIL K<>138;IF K=248 THEN BEGIN INPOSTAMBLE:=TRUE;GOTO 30;END;
IF K<>139 THEN BEGIN WRITE(' ','Bad DVI file: ','byte ',CURLOC-1:1,
' is not bop','!');JUMPOUT;END;{98:}NEWBACKPOINT:=CURLOC-1;
PAGECOUNT:=PAGECOUNT+1;FOR K:=0 TO 9 DO COUNT[K]:=SIGNEDQUAD;
IF SIGNEDQUAD<>OLDBACKPOINT THEN WRITELN('backpointer in byte ',CURLOC-4
:1,' should be ',OLDBACKPOINT:1,'!');OLDBACKPOINT:=NEWBACKPOINT{:98};
END;30:END{:110};
IF OUTMODE<3 THEN BEGIN IF NOT INPOSTAMBLE THEN SKIPPAGES;
IF SIGNEDQUAD<>OLDBACKPOINT THEN WRITELN('backpointer in byte ',CURLOC-4
:1,' should be ',OLDBACKPOINT:1,'!');READPOSTAMBL;END;9999:END.{:106}